# 1.必备
# 指定最低兼容版本
cmake_minimum_required(VERSION 3.22) 
# 指定项目的名称, 还可指定语言和版本号，一般定义一次，会生成一些全局cmake变量
project(step_add_lib)  
# 指定源代码文件创建可执行文件step_base
add_executable(step_add_lib step2.cc) 


# 2.cmake 命令
# CMAKE_CXX_STANDARD # 指定 C++ 标准
# CMAKE_CXX_STANDARD_REQUIRED
set(CMAKE_CXX_STANDARD  11)
set(CMAKE_CXX_STANDARD_REQUIRED  True)


# 3.添加版本号和配置文件
# 当 project() 命令被调用时，CMake 在幕后定义了 step_base_VERSION_MAJOR 和 step_base_VERSION_MINOR
project(step_add_lib VERSION 1.1.1) 
# 创建一个配置文件模板，xx.h.in, 使用 configure_file() 传递的变量, 替换输入文件内容中的一些变量值 @VAR@，并输出文件
# 在 configure_file 中，变量需要使用 ${} 语法来引用
# 使用 @ONLY 参数表示只替换 @VAR@ 形式的变量，而不替换 $VAR 形式的变量（类 Unix shell 风格）
set(MY_VAR "Hello, World!") # 自定义变量
configure_file(config.h.in config.h @ONLY)
configure_file(config_temp.txt config.txt )
# 由于配置文件将写入项目二进制目录，必须将该目录添加到路径列表中以搜索包含文件使用 
target_include_directories(step_add_lib PUBLIC ${PROJECT_BINARY_DIR}) 

#----------------------------------------------------------------------------
# # 增加构建子目录
# add_subdirectory(mylib)
# # 链接子目录里定义的库到目标可执行文件
# target_link_libraries(step_add_lib PUBLIC MyFunc) 
# # 指定库的头文件位置
# target_include_directories(step_add_lib PUBLIC ${PROJECT_BINARY_DIR} ${PROJECT_SOURCE_DIR}/mylib)


# 增加配置项让库可选导入， 默认 ON
option(USE_MYFUNC "Use my func" ON)
if(USE_MYFUNC)
  add_subdirectory(mylib)
  list(APPEND EXTRA_LIBS MyFunc) # 将字符串 MyFunc 添加到 EXTRA_LIBS 变量的末尾。
  # list(APPEND EXTRA_INCLUDES ${PROJECT_SOURCE_DIR}/mylib)
  target_link_libraries(step_add_lib PUBLIC ${EXTRA_LIBS})
  # target_include_directories(step_add_lib PUBLIC ${PROJECT_BINARY_DIR} ${EXTRA_INCLUDES})

  configure_file(config.h.in config.h @ONLY)
  # cmake .. -DUSE_MYFUNC=OFF
endif()


enable_testing()  # 启用测试
add_executable(my_test ctest/my_test.cc)
add_executable(my_test2 ctest/my_test2.cc)
target_link_libraries(my_test PRIVATE MyFunc)
target_link_libraries(my_test2 PRIVATE MyFunc)
# 注册测试
add_test(NAME MyCodeTests COMMAND my_test)
add_test(NAME MyCodeTests2 COMMAND my_test2)


find_package(GTest REQUIRED)
add_executable(my_gtest ctest/gtest.cc)
target_link_libraries(my_gtest PRIVATE MyFunc GTest::Main)
add_test(NAME MyGTests COMMAND my_gtest)